home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / msdos / css / source / kinput.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-19  |  8.4 KB  |  285 lines

  1.  
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <string.h>
  5.  
  6. #include <glib.h>
  7. #include <strlib.h>
  8.  
  9. #define col0 0
  10. #define col6 6
  11.  
  12. /* xy  check     return( yes=1, no=0 ) */
  13. int sed_xychk(int x, int y, int x1, int y1, int x2, int y2)
  14. {
  15.     if (x1<=x && x<=x2 && y1<=y && y<=y2) return(1);
  16.     return(0);
  17. }
  18.  
  19. /*
  20.   汎用質問プログラム
  21. */
  22. int qas(int lx, int ly, char qq[], char aa[], int max)
  23.         {
  24.                 int  xx,i, j, k;
  25.                 char ans[64], wks[100];
  26.                 
  27.                 locate( lx,ly,COFF);
  28.                 symbol_( 8*lx, 16*ly, qq, 1, 1, col6, 0, PSET);
  29.                 xx = lx + strlen(qq);
  30.                 /*    sprintf(ans, "%s", aa);   */
  31.                 color(2, 0);
  32.                 i = sedline(xx, ly, aa);
  33.                 /*    strcpy(aa, ans);          */
  34.                 k = strlen(aa);
  35.                 j = 0;
  36.                 locate( xx, ly,COFF);
  37.                 while (j < k) {
  38.                    printf(" ");
  39.                    j++;
  40.                 }
  41.                 color( 7, 0);
  42.                 locate( 0,0,COFF);
  43.                 aa[max] = '\0';
  44.                 sprintf(wks, "%s%s", qq, aa);
  45.                 symbol_( 8*lx, 16*ly, wks, 1, 1, col0, 0, PSET);
  46.                 return(i);
  47.          }
  48.  
  49.  
  50. int qyn(lx, ly, qq)
  51.         int    lx,ly;
  52.         char   *qq;
  53.         {
  54.                 int  i;
  55.  
  56.                 color( 6, 0);
  57.                 locate( lx,ly,COFF);
  58.                 printf("%s\n", qq);
  59.                 locate( lx, ly,CON);
  60.                 i = getch();
  61.                 color( 4, 0);
  62.                 locate( lx,ly,CON);
  63.                 printf("%s\n", qq);
  64.                 return(i);
  65.          }
  66.  
  67. /*
  68.    xl , yl カーソル位置    lin 入力文字バッファ   lim 最大文字数
  69.    return時の返り値は最後に入力した文字
  70. */
  71. int sedline(int xl, int yl, char lin[], int lim)
  72. {
  73.     int  i, j, inp1, ptr=0, kp, cnt, insw, q;
  74.     int  xl2, yl2;
  75.     char *lin2, *sp;
  76.     int  mx, my;
  77.     
  78.     lin2 = lin;
  79.     xl2  = xl;   yl2 = yl;
  80.     
  81.     locate(xl, yl, COFF);
  82.     for(i=1; i <= lim; i++) putchar(' ');
  83.     locate(xl, yl, CON);
  84.     printf("%s\n", lin);
  85.     insw = 0;
  86.     for (;;) {
  87.       locate(xl2, yl2, CON);
  88.       do {
  89.         if (kbhit() == 0) {
  90.            if ((MOS_rdpos(&mx, &my) & 0x01) == 1) {
  91.               while((MOS_rdpos(&mx, &my) & 0x01) == 1);
  92.               mx = mx / 8; my = my /16;
  93.               if (sed_xychk(mx, my, xl, yl, xl+lim, yl+1) == 0) return((int)0x0d);
  94.               else {
  95.                  if (xl2 != mx) {
  96.                     if (xl2 > mx) {
  97.                        cnt = xl2 - mx;
  98.                        inp1 = 0x1d; /* left */
  99.                     } else {
  100.                        cnt = mx - xl2;
  101.                        inp1 = 0x1c; /* left */
  102.                     }
  103.                     insw = 1;
  104.                  }
  105.               }
  106.            }
  107.         } else {
  108.            inp1 = getch();
  109.            cnt  = 1;
  110.            insw = 1;
  111.         }
  112.       } while (insw == 0);
  113.       insw = 0;
  114.       
  115.       for (q = 0; q < cnt; q++) {
  116.         if (inp1 < ' ') {
  117.              switch (inp1) {
  118.              case 0x08 : /* BS */
  119.                       if (ptr > 0) {
  120.                              kp = chkchr(lin, ptr-1);
  121.                              if ((kp == 0) || (kp == 1)) kp = 1;
  122.                              else                        kp = 2;
  123.                              
  124.                              lin2 = lin + ptr;
  125.                              ptr -= kp;
  126.                              xl2 -= kp;
  127.                              lin[ptr] = '\0';
  128.                              strcat(lin, lin2);
  129.                              lin2 -= kp;
  130.                              locate(xl2, yl2, COFF);
  131.                              if (kp == 2) sp = "  ";
  132.                              else         sp = " ";
  133.                              printf("%s%s\n", lin2, sp);
  134.                       }
  135.                       break;
  136.  
  137.              case 0x07 :  /* DEL */
  138.              case 0x14 :  /* CTRL-T カーソルから右消去 */
  139.                       if (inp1 == 0x07) i = 1;
  140.                       else i = strlen(lin+ptr);
  141.                       for (j = 0; j < i; j++) {
  142.                          if (lin[ptr] != '\0') {
  143.                              kp = chkchr(lin, ptr);
  144.                              if (kp == 0) kp = 1;
  145.                              else         kp = 2;
  146.                            
  147.                              lin[ptr] = '\0';
  148.                              lin2 = lin+ptr+kp;
  149.                              strcat(lin, lin2);
  150.                              lin2 -= kp;
  151.                              locate(xl2, yl2, COFF);
  152.                              if (kp == 2) sp = "  ";
  153.                              else         sp = " ";
  154.                              printf("%s%s\n", lin2, sp);
  155.                           }
  156.                       }
  157.                       break;
  158.                     
  159.              case 0x1d : /* left */
  160.                       if (ptr != 0) {
  161.                              kp = chkchr(lin, ptr-1);
  162.                              if (kp == 0 || kp == 1) kp = 1;
  163.                              else                    kp = 2;
  164.  
  165.                              ptr -= kp;
  166.                              xl2 -= kp;
  167.                              break;
  168.                       }
  169.                       break;
  170.                       /* return(inp1); */
  171.              
  172.              case 0x1c : /* right */
  173.                       if (ptr >= lim-1) break; /* or return(inp1); 入力文字数制限を越えてカーソルを移動することは出来ない */ 
  174.                       if (lin[ptr] != '\0') {
  175.                             kp = chkchr(lin, ptr);
  176.                             if (kp == 0 || kp == 2) kp = 1;
  177.                             else                    kp = 2;
  178.  
  179.                             ptr += kp;
  180.                             xl2 += kp;
  181.                             break;
  182.                       }
  183.                       break;
  184.                       /* return(inp1); */
  185.              case 0x19 : /* CTRL-Y 一行消去 */
  186.                          lin2  = lin;
  187.                          *lin2 = 0;
  188.                          ptr   = 0;
  189.                          xl2   = xl;   yl2 = yl;
  190.                          locate(xl, yl, COFF);
  191.                          for(i=1; i <= lim; i++) putchar(' ');
  192.                          locate(xl, yl, CON);
  193.                          break;
  194.              case 0x1b : /* esc */
  195.              case 0x0d : return(inp1);
  196.             /*
  197.              case 0x1e :
  198.              case 0x1f :
  199.             */
  200.  
  201.              defalt    :
  202.                       break;
  203.              }
  204.                         
  205.         } else {
  206.              i = xl2;
  207.              xl2++;
  208.              lin2 = lin + ptr++;
  209.              sh1(lin2);
  210.              *lin2 = inp1;
  211.              if (kanji1(lin2, 0) == 1) {
  212.                   xl2++;
  213.                   ptr++;
  214.                   sh1(++lin2);
  215.                   *lin2-- = getch();
  216.              }
  217.              if (strlen(lin) >= lim) { /* 入力文字数制限 */
  218.                 lin[lim] = '\0';
  219.                 if (ptr >= lim) {
  220.                    ptr = lim-1;
  221.                    xl2--;
  222.                 }
  223.              }
  224.              
  225.              locate(i, yl2, COFF);
  226.              printf("%s\n", lin2);
  227.         }
  228.       }
  229.     } /* for(;;) end */
  230. }
  231.  
  232. /* ポインタの部分から文字列を一文字、右へずらす。 */
  233. sh1(p)
  234. char  *p;
  235. {
  236.       int x, y;
  237.       
  238.       y = -1;
  239.       for (;;) {
  240.             x = *p;
  241.             if ((*p++ = y) == 0) break;
  242.             y = *p;
  243.             if ((*p++ = x) == 0) break;
  244.       }
  245. }
  246.  
  247.  
  248. int kanji1(p, ptr)
  249. char   p[];
  250. int    ptr;
  251. {
  252.      int  ch;
  253.           ch = p[ptr] & 0xff;
  254.           return(( ((0x81 <= ch) && (ch <= 0x9f)) ||
  255.                    ((0xe0 <= ch) && (ch <= 0xfc))    ) ? 1 : 0);
  256. }
  257.  
  258.  
  259.  
  260. int chkchr(lin, ptr)
  261. char   *lin;
  262. int    ptr;
  263. {
  264.      int  ptr2;
  265.      
  266.           ptr2 = ptr;
  267.           while ((ptr2 > 0)  &&
  268.                 (((lin[ptr2] & 0xff) >  0x3f) &&
  269.                  ((lin[ptr2] & 0xff) != 0x7f))) {
  270.                 ptr2--;
  271.           }
  272.           while (ptr2 < (ptr-1)) {
  273.                 if (kanji1(lin, ptr2)) ptr2 += 2;
  274.                 else                   ptr2++;
  275.           }
  276.           if ((ptr2 == (ptr -1)) && kanji1(lin, ptr2)) return(2);
  277.           else  {
  278.                      if (kanji1(lin, ptr)) return(1);
  279.                      else                  return(0);
  280.           }
  281. }
  282.  
  283.  
  284.  
  285.